package framework.util.controller;

import com.esotericsoftware.reflectasm.MethodAccess;
import framework.bo.SysUser;
import framework.bo.SysUserRole;
import framework.common.Common;
import framework.common.ResponseVo;
import framework.util.codeset.vo.CodesetVo;
import framework.util.layui._LayuiUtil;
import framework.util.queryFilter.service.impl.QueryFilter;
import framework.util.queryFilter.vo.Where;
import framework.util.shiro._ShiroUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


/**
 * 增强BaseController，<b>可以放普遍的业务方法</b>
 *
 * @author 吴宇亮 2019年1月5日
 */
public class BaseController {

	public static final transient Logger log = LoggerFactory.getLogger(BaseController.class);

	/************************************** 代码集 **************************************/
	/**
	 * <b>缓存代码集，使用时注意NPE，如果获取不存在的代码集，将会返回null。</b><br/><br/>
	 *
	 * 使用示例： <br/>
	 * System.out.println(BaseController.CODE.get("sex").getValue()); //输出性别 <br/>
	 * System.out.println(BaseController.CODE.get("性别").getValue()); //输出sex <br/>
	 *
	 * System.out.println(BaseController.CODE.get("sex").get("1")); //输出男 <br/>
	 * System.out.println(BaseController.CODE.get("sex").get("男")); //输出1 <br/>
	 * System.out.println(BaseController.CODE.get("性别").get("1")); //输出男 <br/>
	 * System.out.println(BaseController.CODE.get("性别").get("男")); //输出1 <br/>
	 *
	 * System.out.println(BaseController.CODE.get("sex").get("2")); //输出女 <br/>
	 * System.out.println(BaseController.CODE.get("sex").get("女")); //输出2 <br/>
	 * System.out.println(BaseController.CODE.get("性别").get("2")); //输出女 <br/>
	 * System.out.println(BaseController.CODE.get("性别").get("女")); //输出2 <br/>
	 */
	public static final Map<String, CodesetVo> CODE = new HashMap<>(500);

	/************************************** 快速过滤 **************************************/
	/**
	 * 给当前filter过滤 删除状态为<b>未删除</b> 的数据
	 */
	public void filterDelete(QueryFilter filter){
		filter.where(Common.IS_DELETE, Where.eq, Common.IS_NO);
	}

    /**
     * 给当前filter过滤 使用状态为<b>正在使用</b> 的数据
     */
    public void filterUse(QueryFilter filter){
        filter.where(Common.IS_USE, Where.eq, Common.IS_YEW);
    }

	/**
	 * 用于权限过滤，普通用户自己只能看自己的数据。
	 *
	 * @param filter
	 * @param fieldName 要过滤的字段名
	 * @author 吴宇亮
	 * @date 2019年1月18日
	 */
	/*public void filterByUser(QueryFilter filter, String fieldName) {
		//普通用户只能看自己的
		String roleid = AppUtil.getRoleid();
		if(!Common.ROLE1.equals(roleid)){
			filter.addFilter("Q_"+fieldName+"_N_EQ", AppUtil.getUserId()+"");
		}
	}*/

	/**
	 * 用于app的权限过滤，普通用户自己只能看自己的数据。
	 *
	 * @param filter
	 * @param fieldName 要过滤的字段名`
	 * @param userlid app传来的userlid
	 * @author 吴宇亮
	 * @date 2019年1月18日
	 */
	/*public void filterByUser(QueryFilter filter, String fieldName, String userlid) {
		//普通用户只能看自己的
		Users user = userService.get(Integer.valueOf(userlid));
		if(!Common.ROLE1.equals(user.getRolelid())){
			filter.addFilter("Q_"+fieldName+"_N_EQ", userlid);
		}
	}*/

	/************************************** 设置操作时间 **************************************/
	/**
	 * 设置bo的操作人、操作时间。
	 */
	public static<T> void setOperatorToBo(T bo) {
		setOperatorToBo(bo, "Operator");
	}

	/**
	 * 设置bo的创建人、创建时间。
	 */
	public static<T> void setCreateToBo(T bo) {
		setOperatorToBo(bo, "Create");
	}

	/**
	 * 设置bo的修改人、修改时间。
	 */
	public static<T> void setUpdateToBo(T bo) {
		setOperatorToBo(bo, "Update");
	}

	private static<T> void setOperatorToBo(T bo, String type) {
		String nowTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
		SysUser currentUser = getCurrentUser();

		MethodAccess methodAccess = MethodAccess.get(bo.getClass());
		methodAccess.invoke(bo, "set" + type + "Id", currentUser.getLid());
		methodAccess.invoke(bo, "set" + type + "Name", currentUser.getCname());
		methodAccess.invoke(bo, "set" + type + "Time", nowTime);
	}

	/************************************** 设置操作时间 **************************************/
	public static SysUser getCurrentUser(){
		return _ShiroUtil.getCurrentUser();
	}

	/************************************** 前端响应 **************************************/
	/**
	 * 响应前端，操作成功
	 */
	public ResponseVo sendSuccess() {
		return sendSuccess("");
	}

	/**
	 * 响应前端，操作成功
	 */
	public ResponseVo sendSuccess(String msg, String tipsType) {
		ResponseVo result = new ResponseVo();
		result.setCode(Common.HTTP_CODE_SUCCESS);
		result.setMsg(msg);
		result.setLayerType(tipsType);
		return result;
	}

	/**
	 * 响应前端，操作成功
	 */
	public ResponseVo sendSuccess(Object data) {
		ResponseVo result = new ResponseVo();
		result.setData(data);
		result.setCode(Common.LAYUI_CODE_SUCCESS);
		result.setMsg("操作成功");
		return result;
	}

	/**
	 * 响应前端，操作成功
	 */
	public ResponseVo sendSuccess(List data, Integer count) {
		ResponseVo result = new ResponseVo();
		result.setData(data);
		result.setCount(count);
		result.setCode(Common.LAYUI_CODE_SUCCESS);
		result.setMsg("操作成功");
		return result;
	}

	/**
	 * 响应前端，操作失败
	 */
	public ResponseVo sendFail() {
		return sendFail("操作失败");
	}

	/**
	 * 响应前端，操作失败
	 */
	public ResponseVo sendFail(String msg) {
		return sendFail(msg, ResponseVo.LAYER_TYPE_MSG);
	}

	/**
	 * 响应前端，操作失败。并指定前端弹出的提示框，是msg、alert还是confirm等
	 *
	 * @param msg 消息内容
	 * @param tipsType 前端弹出的提示框类型
	 * @author 吴宇亮 2019年1月24日
	 */
	public ResponseVo sendFail(String msg, String tipsType) {
		ResponseVo result = new ResponseVo();
		result.setCode(Common.HTTP_CODE_FAIL);
		result.setMsg(msg);
		result.setLayerType(tipsType);
		return result;
	}

	/**
	 * 响应前端，后台报错
	 */
	public ResponseVo sendError() {
		ResponseVo result = new ResponseVo();
		result.setCode(Common.HTTP_CODE_FAIL);
		result.setMsg("操作失败");
		return result;
	}

	/**
	 * 响应前端，后台报错
	 */
	public ResponseVo sendError(String msg) {
		ResponseVo result = new ResponseVo();
		result.setCode(Common.HTTP_CODE_FAIL);
		result.setMsg(msg);
		return result;
	}




}

























